Question
ADSI, DirectoryEntry et {System.__ComObject}
- clem
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 27
- Remerciements reçus 0
il y a 16 ans 4 mois #5646
par clem
ADSI, DirectoryEntry et {System.__ComObject} a été créé par clem
Bonsoir,
J'essai de me connecter sur un objet de l'ad avec :
[code:1]$userpath = \"LDAP://CN=testuser,OU=Domain Admins,DC=mondomaine,DC=local\"
$CreatedUser = [ADSI]$userpath[/code:1]
J'essai de recuperer, en vain, la date d'expiration du compte contenue dans la propriété 'accountexpires' ( de type {System.__ComObject} )
Le but est de créer un nouvel objet PSObject, qui contiendra les valeurs de certains attributs d'un compte Active directory :
[code:1]function MakeObject {
param (
$Firstname,
$LastName,
$DisplayName,
$Mail,
$CreationDate,
$Department,
$City,
$Manager,
$Title,
$Description,
$ExpirationDate,
$PersonalFolder,
$DistinguishedName,
$HomeMDB
)
$svrObj = New-Object PSObject
$svrObj | Add-Member NoteProperty \"Firstname\" \"$Firstname\"
$svrObj | Add-Member NoteProperty \"LastName\" \"$LastName\"
$svrObj | Add-Member NoteProperty \"DisplayName\" \"$DisplayName\"
$svrObj | Add-Member NoteProperty \"Mail\" \"$Mail\"
$svrObj | Add-Member NoteProperty \"CreationDate\" \"$CreationDate\"
$svrObj | Add-Member NoteProperty \"Department\" \"$Department\"
$svrObj | Add-Member NoteProperty \"City\" \"$City\"
$svrObj | Add-Member NoteProperty \"Manager\" \"$Manager\"
$svrObj | Add-Member NoteProperty \"Title\" \"$Title\"
$svrObj | Add-Member NoteProperty \"Description\" \"$Description\"
$svrObj | Add-Member NoteProperty \"ExpirationDate\" \"$ExpirationDate\"
$svrObj | Add-Member NoteProperty \"PersonalFolder\" \"$PersonalFolder\"
$svrObj | Add-Member NoteProperty \"DistinguishedName\" \"$DistinguishedName\"
$svrObj | Add-Member NoteProperty \"HomeMDB\" \"$HomeMDB\"
##more fields here..
write-output $svrObj
}[/code:1]
Puis d'ajouter le contenu dans un fichier csv existant :
[code:1]$userpath = \"LDAP://CN=testuser,OU=Domain Admins,DC=mondomaine,DC=local\"
$CreatedUser = [ADSI]$userpath
$report = \"C:\Powershell\Scripts\projet user creation eutelsat\1.0\Logs\UserCreationReport_$((Get-Date).year).csv\"
# si un fichier de log à été trouvé
if (Test-Path $report)
{
# on importe le fichier csv
Write-Host \"fichier log existe\"
[System.Object[]]$users = Import-Csv $report
}
else
{
# Write-Host \"fichier log n'existe pas\"
$users = @()
}
#ajout de l'objet au contenu du fichier csv
$users += MakeObject -Firstname $CreatedUser.givenname -LastName $CreatedUser.sn -DisplayName $CreatedUser.DisplayName `
-Mail $CreatedUser.mail -CreationDate $CreatedUser.whencreated -Department $CreatedUser.Department `
-City $CreatedUser.l -Manager $CreatedUser.Manager -Title $CreatedUser.Title -Description $CreatedUser.Description`
-ExpirationDate $CreatedUser.accountExpires -PersonalFolder \"\\server\users\monuser\" `
-DistinguishedName $CreatedUser.DistinguishedName -HomeMDB $CreatedUser.HomeMDB
# export vers le fichier csv
$users | Export-csv -Path $report -NoTypeInformation -Force
Invoke-Item $report[/code:1]
$CreatedUser.accountExpires est de type [System.__ComObject] et je n'arrive pas à en récuperer le contenu.
J'ai cru comprendre qu'une solution de conversion existait avec le framework mais je n'ai pas reussi à l'appliquer
Je pourrais utiliser cette solution :
[code:1]$searcher = New-Object DirectoryServices.DirectorySearcher
$searcher.filter = \"(&(samaccountname=testuser))\"
$results = $searcher.findone()
$results.properties.accountexpires
[datetime]::fromfiletime($results.properties.accountexpires[0])
[/code:1]
Mais jaimerai pouvoir utiliser la premiere methode en me connectant sur l'objet avec son chemin LDAP
Pourriez vous m'aider à accéder a cet objet de type{System.__ComObject} svp
Merci.
Clément
Message édité par: clem, à: 16/11/09 22:12<br><br>Message édité par: clem, à: 17/11/09 12:18
J'essai de me connecter sur un objet de l'ad avec :
[code:1]$userpath = \"LDAP://CN=testuser,OU=Domain Admins,DC=mondomaine,DC=local\"
$CreatedUser = [ADSI]$userpath[/code:1]
J'essai de recuperer, en vain, la date d'expiration du compte contenue dans la propriété 'accountexpires' ( de type {System.__ComObject} )
Le but est de créer un nouvel objet PSObject, qui contiendra les valeurs de certains attributs d'un compte Active directory :
[code:1]function MakeObject {
param (
$Firstname,
$LastName,
$DisplayName,
$Mail,
$CreationDate,
$Department,
$City,
$Manager,
$Title,
$Description,
$ExpirationDate,
$PersonalFolder,
$DistinguishedName,
$HomeMDB
)
$svrObj = New-Object PSObject
$svrObj | Add-Member NoteProperty \"Firstname\" \"$Firstname\"
$svrObj | Add-Member NoteProperty \"LastName\" \"$LastName\"
$svrObj | Add-Member NoteProperty \"DisplayName\" \"$DisplayName\"
$svrObj | Add-Member NoteProperty \"Mail\" \"$Mail\"
$svrObj | Add-Member NoteProperty \"CreationDate\" \"$CreationDate\"
$svrObj | Add-Member NoteProperty \"Department\" \"$Department\"
$svrObj | Add-Member NoteProperty \"City\" \"$City\"
$svrObj | Add-Member NoteProperty \"Manager\" \"$Manager\"
$svrObj | Add-Member NoteProperty \"Title\" \"$Title\"
$svrObj | Add-Member NoteProperty \"Description\" \"$Description\"
$svrObj | Add-Member NoteProperty \"ExpirationDate\" \"$ExpirationDate\"
$svrObj | Add-Member NoteProperty \"PersonalFolder\" \"$PersonalFolder\"
$svrObj | Add-Member NoteProperty \"DistinguishedName\" \"$DistinguishedName\"
$svrObj | Add-Member NoteProperty \"HomeMDB\" \"$HomeMDB\"
##more fields here..
write-output $svrObj
}[/code:1]
Puis d'ajouter le contenu dans un fichier csv existant :
[code:1]$userpath = \"LDAP://CN=testuser,OU=Domain Admins,DC=mondomaine,DC=local\"
$CreatedUser = [ADSI]$userpath
$report = \"C:\Powershell\Scripts\projet user creation eutelsat\1.0\Logs\UserCreationReport_$((Get-Date).year).csv\"
# si un fichier de log à été trouvé
if (Test-Path $report)
{
# on importe le fichier csv
Write-Host \"fichier log existe\"
[System.Object[]]$users = Import-Csv $report
}
else
{
# Write-Host \"fichier log n'existe pas\"
$users = @()
}
#ajout de l'objet au contenu du fichier csv
$users += MakeObject -Firstname $CreatedUser.givenname -LastName $CreatedUser.sn -DisplayName $CreatedUser.DisplayName `
-Mail $CreatedUser.mail -CreationDate $CreatedUser.whencreated -Department $CreatedUser.Department `
-City $CreatedUser.l -Manager $CreatedUser.Manager -Title $CreatedUser.Title -Description $CreatedUser.Description`
-ExpirationDate $CreatedUser.accountExpires -PersonalFolder \"\\server\users\monuser\" `
-DistinguishedName $CreatedUser.DistinguishedName -HomeMDB $CreatedUser.HomeMDB
# export vers le fichier csv
$users | Export-csv -Path $report -NoTypeInformation -Force
Invoke-Item $report[/code:1]
$CreatedUser.accountExpires est de type [System.__ComObject] et je n'arrive pas à en récuperer le contenu.
J'ai cru comprendre qu'une solution de conversion existait avec le framework mais je n'ai pas reussi à l'appliquer
Je pourrais utiliser cette solution :
[code:1]$searcher = New-Object DirectoryServices.DirectorySearcher
$searcher.filter = \"(&(samaccountname=testuser))\"
$results = $searcher.findone()
$results.properties.accountexpires
[datetime]::fromfiletime($results.properties.accountexpires[0])
[/code:1]
Mais jaimerai pouvoir utiliser la premiere methode en me connectant sur l'objet avec son chemin LDAP
Pourriez vous m'aider à accéder a cet objet de type{System.__ComObject} svp
Merci.
Clément
Message édité par: clem, à: 16/11/09 22:12<br><br>Message édité par: clem, à: 17/11/09 12:18
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 4 mois #5648
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:ADSI, DirectoryEntry et {System.__ComObject}
Salut,
as-tu essayé ceci :
[code:1]$CreatedUser.InvokeGet('accountExpires')
#ou
$CreatedUser.Psbase.InvokeGet('accountExpires')
[/code:1]
as-tu essayé ceci :
[code:1]$CreatedUser.InvokeGet('accountExpires')
#ou
$CreatedUser.Psbase.InvokeGet('accountExpires')
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- clem
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 27
- Remerciements reçus 0
il y a 16 ans 4 mois #5653
par clem
Réponse de clem sur le sujet Re:ADSI, DirectoryEntry et {System.__ComObject}
Bonjour Laurent,
[code:1]$CreatedUser.InvokeGet('accountExpires') [/code:1]:
Et :
[code:1]$a = $CreatedUser.Psbase.InvokeGet('accountExpires')
$a[/code:1]
$a ne renvoit rien hélas
[code:1]$CreatedUser.InvokeGet('accountExpires') [/code:1]:
Exception lors de l'appel de « InvokeGet » avec « 1 » argument(s) : « Unknown name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME)) »
à : ligne:48 caractère:27
+ $a = $CreatedUser.InvokeGet <<<< ('accountExpires')
Et :
[code:1]$a = $CreatedUser.Psbase.InvokeGet('accountExpires')
$a[/code:1]
$a ne renvoit rien hélas
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 4 mois #5656
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:ADSI, DirectoryEntry et {System.__ComObject}
clem écrit:
Sinon une dernière piste :
[code:1]
$Res=[System.__ComObject].InvokeMember(\"accountexpires\",[System.Reflection.BindingFlags]::GetProperty,$null,$CreatedUser.psbase.NativeObject,$null)
[/code:1]
clem écrit:
As-tu vérifier avec l'autre approche ? Le champ est peut-être vide.$a ne renvoit rien
Sinon une dernière piste :
[code:1]
$Res=[System.__ComObject].InvokeMember(\"accountexpires\",[System.Reflection.BindingFlags]::GetProperty,$null,$CreatedUser.psbase.NativeObject,$null)
[/code:1]
clem écrit:
Il est peut être possible de coder une fonction en utilisant ce constructeur .Mais j'aimerai pouvoir utiliser la premiere methode en me connectant sur l'objet avec son chemin LDAP
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 16 ans 4 mois #5660
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Re:ADSI, DirectoryEntry et {System.__ComObject}
Bonsoir à tous,
J'ai essayé ce que tu proposes Laurent mais sans succès non plus; ça retourne toujours la valeur System.__ComObject.
Ca doit venir du fait que le support d'ADSI avec le moniker LDAP est relativement moyen...
Ceci dit j'ai quand même réussi à trouver une solution de contournement en utilisant le moniker WinNT.
Exemple :
[code:1]
$objUser=[ADSI]'WinNT://./Bracame,user'
PS > $objUser.AccountExpirationDate
vendredi 18 décembre 2009 00:00:00
[/code:1]
[code:1]PS > $objUser | Format-List *
UserFlags : {545}
AccountExpirationDate : {18/12/2009 00:00:00}
MaxStorage : {-1}
PasswordAge : {450478}
PasswordExpired : {0}
LoginHours : {255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255}
FullName : {}
Description : {Compte utilisateur}
BadPasswordAttempts : {0}
LastLogin : {12/11/2009 18:13:53}
HomeDirectory : {\\srvfic1\users\Bracame}
LoginScript : {login.vbs}
Profile : {}
HomeDirDrive : {L:}
Parameters : {}
PrimaryGroupID : {513}
Name : {Bracame}
MinPasswordLength : {7}
MaxPasswordAge : {3628800}
MinPasswordAge : {86400}
PasswordHistoryLength : {24}
AutoUnlockInterval : {1800}
LockoutObservationInterval : {1800}
MaxBadPasswordsAllowed : {0}
objectSid : {1 5 0 0 0 0 0 5 21 0 0 0 188 63 244 59 115 126 5 127 14 125 224 104 153 4 0 0}
AuthenticationType : Secure
Children : {}
Guid : {D83F1060-1E71-11CF-B1F3-02608C9E7553}
ObjectSecurity :
NativeGuid : {D83F1060-1E71-11CF-B1F3-02608C9E7553}
NativeObject : System.__ComObject
Parent : WinNT://powershell-scripting.com/.
Password :
Path : WinNT://./Bracame,user
Properties : {UserFlags, AccountExpirationDate, MaxStorage, PasswordAge...}
SchemaClassName : User
SchemaEntry : System.DirectoryServices.DirectoryEntry
UsePropertyCache : True
Username :
Options :
Site :[/code:1]
Donc moralité, mieux vaut peut-être pour ce script mettre de côté le moniker LDAP. Ou alors au contraire jouer avec les 2 si des propriétés ne sont pas disponibles avec l'un mais disponibles avec l'autre.
Arnaud
J'ai essayé ce que tu proposes Laurent mais sans succès non plus; ça retourne toujours la valeur System.__ComObject.
Ca doit venir du fait que le support d'ADSI avec le moniker LDAP est relativement moyen...
Ceci dit j'ai quand même réussi à trouver une solution de contournement en utilisant le moniker WinNT.
Exemple :
[code:1]
$objUser=[ADSI]'WinNT://./Bracame,user'
PS > $objUser.AccountExpirationDate
vendredi 18 décembre 2009 00:00:00
[/code:1]
[code:1]PS > $objUser | Format-List *
UserFlags : {545}
AccountExpirationDate : {18/12/2009 00:00:00}
MaxStorage : {-1}
PasswordAge : {450478}
PasswordExpired : {0}
LoginHours : {255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255}
FullName : {}
Description : {Compte utilisateur}
BadPasswordAttempts : {0}
LastLogin : {12/11/2009 18:13:53}
HomeDirectory : {\\srvfic1\users\Bracame}
LoginScript : {login.vbs}
Profile : {}
HomeDirDrive : {L:}
Parameters : {}
PrimaryGroupID : {513}
Name : {Bracame}
MinPasswordLength : {7}
MaxPasswordAge : {3628800}
MinPasswordAge : {86400}
PasswordHistoryLength : {24}
AutoUnlockInterval : {1800}
LockoutObservationInterval : {1800}
MaxBadPasswordsAllowed : {0}
objectSid : {1 5 0 0 0 0 0 5 21 0 0 0 188 63 244 59 115 126 5 127 14 125 224 104 153 4 0 0}
AuthenticationType : Secure
Children : {}
Guid : {D83F1060-1E71-11CF-B1F3-02608C9E7553}
ObjectSecurity :
NativeGuid : {D83F1060-1E71-11CF-B1F3-02608C9E7553}
NativeObject : System.__ComObject
Parent : WinNT://powershell-scripting.com/.
Password :
Path : WinNT://./Bracame,user
Properties : {UserFlags, AccountExpirationDate, MaxStorage, PasswordAge...}
SchemaClassName : User
SchemaEntry : System.DirectoryServices.DirectoryEntry
UsePropertyCache : True
Username :
Options :
Site :[/code:1]
Donc moralité, mieux vaut peut-être pour ce script mettre de côté le moniker LDAP. Ou alors au contraire jouer avec les 2 si des propriétés ne sont pas disponibles avec l'un mais disponibles avec l'autre.
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.077 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- ADSI, DirectoryEntry et {System.__ComObject}